﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Drawing;
using System.Collections;

using Noris.Schedule.Support;
using Noris.Schedule.Support.Data;
using Noris.Schedule.Support.Sql;
using Noris.Schedule.Support.Core;
using Noris.Schedule.Support.Services;

using Noris.Schedule.Planning.DataFace;
using System.Windows.Forms;
using Noris.Schedule.Support.Green;
using Noris.Schedule.Support.Expressions;

// Tento soubor obsahuje jednotky pro získávání dat z paměti pro ExpressionBuilder
namespace Noris.Schedule.Planning.ProcessData
{
	// MfrPlanningConnectorCls : extenze datového konektoru pro získávání dat z paměti pro ExpressionBuilder
	/// <summary>
	/// Konektor do plánovacího procesu ze strany vizuální prezentace.
	/// Poskytuje přístup k potřebným datům plánovacího procesu a vstupní metody pro řízení změn dat.
	/// </summary>
	public partial class MfrPlanningConnectorCls : IClassTreeExtender, IEvaluationDataSource
	{
        #region IClassTreeExtender Members
        /// <summary>
        /// Datový zdroj má šanci nadeklarovat rozšířené atributy pro danou třídu.
        /// Jde o atributy, které běžně nejsou v Green atributech, ale datový zdroj je má k dispozici a chce je nabídnout do stromu tříd.
        /// V argumentu je uvedeno čísla třídy, pro kterou se nyní do stromu tříd načítají data.
        /// Tato metoda může do argumentu do args.Attributes přidat další položky, které budou popisovat další dostupné atributy v dané třídě.
        /// Následně by bylo vhodné, aby je při evaluaci dokázal vlastník rozpoznat a vyhodnotit (v metodě IEvaluationDataSource.TryGetValue()).
        /// </summary>
        /// <param name="args"></param>
        void IClassTreeExtender.GetExtendedAttributes(ClassTreeExtenderGetAttributesArgs args)
        {
            this.GetExtendedAttributesFolder(args);
            switch (args.ClassNumber)
            {
				case PlanUnitCClCls.ClassNr:       // 1365: Stav kapacit
                    this.GetExtendedAttributes1365(args);
                    break;
				case Constants.ClassNumberTime:    // 0x10003: temporary class number pro třídu WorkTimeCls = jednotka času, odpovídá noris třídě 1816
				case PlanUnitCTimeCls.ClassNr:     // 1816: Kapacitní úkol, pracovní čas: jednotky času shrnují více jednotek práce
					this.GetExtendedAttributes1816(args);
					break;
				case Constants.ClassNumberWork:    // 0x10004: temporary class number pro třídu WorkUnitCls = jednotka práce, odpovídá noris třídě 1817
				case PlanUnitCUnitCls.ClassNr:     // 1817: Kapacitní úkol, pracovní jednotka: elementy v grafu jednotlivých pracovních položek
                    this.GetExtendedAttributes1817(args);
					break;
				case PlanUnitSAxisCls.ClassNr:     // 1180: Plánovací jednotka S osa: elementy v grafu Poptávky a plán, hlavní řádek (1 element v řádku)
                    this.GetExtendedAttributes1180(args);
					break;
				case PlanUnitCTaskCls.ClassNr:     // 1363: Kapacitní úkol: elementy v grafu Poptávky a plán, podřízené řádky = jednotlivé operace
                    this.GetExtendedAttributes1363(args);
					break;
            }
        }
        /// <summary>
        /// Datový zdroj má šanci nadeklarovat rozšířené vztahy pro danou třídu.
        /// Jde o vztahy, které běžně nejsou v Green vztazích, ale datový zdroj je má k dispozici a chce je nabídnout do stromu tříd.
        /// V argumentu je uvedeno číslo třídy, pro kterou se nyní do stromu tříd načítají data.
        /// Tato metoda může do argumentu do args.Relations přidat další položky, které budou popisovat další dostupné vztahy v dané třídě.
        /// Následně by bylo vhodné, aby je při evaluaci dokázal vlastník rozpoznat a vyhodnotit (v metodě IEvaluationDataSource.TryGetDataRelated()).
        /// </summary>
        /// <param name="args"></param>
        void IClassTreeExtender.GetExtendedRelations(ClassTreeExtenderGetRelationsArgs args)
        {
            this.GetExtendedRelationsFolder(args);
            switch (args.ClassNumber)
            {
                case PlanUnitCClCls.ClassNr:       // 1365: Stav kapacit
                    this.GetExtendedRelations1365(args);
                    break;
				case Constants.ClassNumberTime:    // 0x10003: temporary class number pro třídu WorkTimeCls = jednotka času, odpovídá noris třídě 1816
				case PlanUnitCTimeCls.ClassNr:     // 1816: Kapacitní úkol, pracovní čas: jednotky času shrnují více jednotek práce
                    this.GetExtendedRelations1816(args);
					break;
				case Constants.ClassNumberWork:    // 0x10004: temporary class number pro třídu WorkUnitCls = jednotka práce, odpovídá noris třídě 1817
                case PlanUnitCUnitCls.ClassNr:     // 1817: Kapacitní úkol, pracovní jednotka: elementy v grafu jednotlivých pracovních položek
                    this.GetExtendedRelations1817(args);
                    break;
                case PlanUnitSAxisCls.ClassNr:     // 1180: Plánovací jednotka S osa: elementy v grafu Poptávky a plán, hlavní řádek (1 element v řádku)
                    this.GetExtendedRelations1180(args);
                    break;
                case PlanUnitCTaskCls.ClassNr:     // 1363: Kapacitní úkol: elementy v grafu Poptávky a plán, podřízené řádky = jednotlivé operace
                    this.GetExtendedRelations1363(args);
                    break;
            }
        }
        #endregion
		#region IEvaluationDataSource Members
        /// <summary>
        /// Datový zdroj se pokusí najít datový objekt podle jeho klíče (číslo třídy + číslo záznamu).
        /// Objekt ukládá do args.ResultData a vrací true.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        bool IEvaluationDataSource.TryGetDataObject(EvaluationDataSourceGetObjectArgs args)
		{
			switch (args.ClassNumber)
			{
                case Constants.ClassNumberPoradac: // 9: Pořadač
                    return this.TryGetDataObject9(args);
				case PlanUnitCClCls.ClassNr:       // 1365: Stav kapacit
					return this.TryGetDataObject1365(args);
				case Constants.ClassNumberTime:    // 0x10003: temporary class number pro třídu WorkTimeCls = jednotka času, odpovídá noris třídě 1816
				case PlanUnitCTimeCls.ClassNr:     // 1816: Kapacitní úkol, pracovní čas: jednotky času shrnují více jednotek práce
					return this.TryGetDataObject1816(args);
				case Constants.ClassNumberWork:    // 0x10004: temporary class number pro třídu WorkUnitCls = jednotka práce, odpovídá noris třídě 1817
                case PlanUnitCUnitCls.ClassNr:     // 1817: Kapacitní úkol, pracovní jednotka
                    return this.TryGetDataObject1817(args);
				case PlanUnitSAxisCls.ClassNr:     // 1180: Plánovací jednotka S osa: elementy v grafu Poptávky a plán, hlavní řádek (1 element v řádku)
                    return this.TryGetDataObject1180(args);
				case PlanUnitCTaskCls.ClassNr:     // 1363: Kapacitní úkol: elementy v grafu Poptávky a plán, podřízené řádky = jednotlivé operace
                    return this.TryGetDataObject1363(args);
            }
			return false;
		}
        /// <summary>
        /// Datový zdroj se pokusí najít datový objekt navázaný k danému záznamu v daném vztahu.
        /// Pokud datový zdroj nic nenajde, pak se jádro pokusí určit klíč cílového záznamu samo (najde údaj ve výchozím záznamu, který odpovídá vztahu, a vyhodnotí jej)
        /// a následně zavolá metodu this.TryGetDataClass() pro takto určený záznam.
        /// Objekt ukládá do args.ResultData a vrací true.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        bool IEvaluationDataSource.TryGetDataRelated(EvaluationDataSourceGetRelatedObjectArgs args)
		{
            // Pokud si uživatel vybral extended vztah "Pořadač" (ten může být z jakéhokoli záznamu), pak to řeší speciální funkce:
            if (args.TargetRelationNumber == Constants.RelationExtNumber_AnyClass_Folder)
                return this.TryGetDataRelatedFolder(args);
                
            switch (args.OriginClassNumber)
            {
                case Constants.ClassNumberPoradac: // 9: Pořadač
                    return this.TryGetDataRelated9(args);
                case PlanUnitCClCls.ClassNr:       // 1365: Stav kapacit
					return this.TryGetDataRelated1365(args);
				case Constants.ClassNumberTime:    // 0x10003: temporary class number pro třídu WorkTimeCls = jednotka času, odpovídá noris třídě 1816
				case PlanUnitCTimeCls.ClassNr:     // 1816: Kapacitní úkol, pracovní čas: jednotky času shrnují více jednotek práce
					return this.TryGetDataRelated1816(args);
				case Constants.ClassNumberWork:    // 0x10004: temporary class number pro třídu WorkUnitCls = jednotka práce, odpovídá noris třídě 1817
                case PlanUnitCUnitCls.ClassNr:     // 1817: Kapacitní úkol, pracovní jednotka
                    return this.TryGetDataRelated1817(args);
				case PlanUnitSAxisCls.ClassNr:     // 1180: Plánovací jednotka S osa: elementy v grafu Poptávky a plán, hlavní řádek (1 element v řádku)
                    return this.TryGetDataRelated1180(args);
 				case PlanUnitCTaskCls.ClassNr:     // 1363: Kapacitní úkol: elementy v grafu Poptávky a plán, podřízené řádky = jednotlivé operace
                    return this.TryGetDataRelated1363(args);
            }
			return false;
		}
        /// <summary>
        /// Datový zdroj se pokusí najít hodnotu atributu v datovém objektu dle specifikce.
        /// Objekt ukládá do args.ResultValue a vrací true.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        bool IEvaluationDataSource.TryGetValue(EvaluationDataSourceGetValueArgs args)
		{
            if (args.Data == null) return false;
            switch (args.DataClassNumber)
            {
                case Constants.ClassNumberPoradac: // 9: Pořadač
                    return this.TryGetValueFolder(args);
                case PlanUnitCClCls.ClassNr:       // 1365: Stav kapacit
                    return this.TryGetValue1365(args);
				case Constants.ClassNumberTime:    // 0x10003: temporary class number pro třídu WorkTimeCls = jednotka času, odpovídá noris třídě 1816
				case PlanUnitCTimeCls.ClassNr:     // 1816: Kapacitní úkol, pracovní čas: jednotky času shrnují více jednotek práce
					return this.TryGetValue1816(args);
				case Constants.ClassNumberWork:    // 0x10004: temporary class number pro třídu WorkUnitCls = jednotka práce, odpovídá noris třídě 1817
                case PlanUnitCUnitCls.ClassNr:     // 1817: Kapacitní úkol, pracovní jednotka
                    return this.TryGetValue1817(args);
                case PlanUnitSAxisCls.ClassNr:     // 1180: Plánovací jednotka S osa: elementy v grafu Poptávky a plán, hlavní řádek (1 element v řádku)
                    return this.TryGetValue1180(args);
				case PlanUnitCTaskCls.ClassNr:     // 1363: Kapacitní úkol: elementy v grafu Poptávky a plán, podřízené řádky = jednotlivé operace
                    return this.TryGetValue1363(args);
			}
			return false;
		}
		#endregion
        #region Doplňování vztahu na Pořadač do všech vhodných míst
        /// <summary>
        /// Doplnění Extended atributů pro Pořadač.
        /// Tato metoda se spouští pro každou datovou třídu!!!
        /// </summary>
        /// <param name="args"></param>
        internal void GetExtendedAttributesFolder(ClassTreeExtenderGetAttributesArgs args)
        { }
        /// <summary>
        /// Doplnění Extended vztahů na Pořadač.
        /// Tato metoda se spouští pro každou datovou třídu!!!
        /// Tato metoda určí, zda daná datová třída má pořadač, a pokud ano tak přidá Extended vztah na třídu Pořadač.
        /// </summary>
        /// <param name="args"></param>
        internal void GetExtendedRelationsFolder(ClassTreeExtenderGetRelationsArgs args)
        {
			if (args.ClassNumber == Constants.ClassNumberPoradac) return; // Ze třídy "Pořadač" nechci navazovat zase další vztah na "Pořadač" !
            ClassInfo classInfo = args.ClassInfo;
            if (classInfo == null) return;
		
            // Pokud má třída pořadač, pak do Extended vztahů zařadím vztah na třídu Pořadač:
            if (classInfo.HasFolders)
            {
                ClassExtendRelation relation = new ClassExtendRelation('F', Constants.RelationExtNumber_AnyClass_Folder, "Pořadač", 9);
                args.ExtendedRelations.Add(relation);
            }
        }
        /// <summary>
        /// Vyhledání navázaného záznamu třídy 9: Pořadač z jakékoli zdrojové třídy.
        /// Jde o Extended vztah Constants.RelationExtNumber_AnyClass_Folder, který doplnila metoda this.GetExtendedRelationsFolder() na kteroukoli třídu, která má pořadače (ClassInfo.HasFolder).
        /// Zde tedy víme co hledáme, musíme hlavně zjistit vstupující číslo pořadače, a to z jakéhokoli objektu.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataRelatedFolder(EvaluationDataSourceGetRelatedObjectArgs args)
        {
            object value;
            if (args.OriginData != null)
            {
                Int32? key = Evaluator.EvaluateRelation(args.OriginData, "cislo_poradace");         // Hledám instanční proměnnou
                if (!key.HasValue)
                    key = Evaluator.EvaluateRelation(args.OriginData, "CisloPoradace");             // Hledám property
                if (key.HasValue && key.Value != 0)
                {
                    FolderInfo folderInfo;
                    if (Repository.Folders.TryGetValue(key.Value, out folderInfo))
                        args.FillResultData(folderInfo, key.Value);
                }
            }
            return false;
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt třídy 9: Pořadač.
        /// Využijeme repozitory a vrátím objekt tamodtud.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataObject9(EvaluationDataSourceGetObjectArgs args)
        {
            int folderNumber = args.SearchGId.RecordNumber;
            FolderInfo folderInfo;
            if (Repository.Folders.TryGetValue(folderNumber, out folderInfo))
                args.FillResultData(folderInfo, folderNumber);
            return false;
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt, který je v daném vztahu k objektu třídy 9: Pořadač.
        /// Tohle v paměti neřeším (jde o standardní green vztahy, ať si to vyřeší Evaluator).
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        private bool TryGetDataRelated9(EvaluationDataSourceGetRelatedObjectArgs args)
        {
            return false;
        }
        private bool TryGetValueFolder(EvaluationDataSourceGetValueArgs args)
        {
            object value;
            if (Evaluator.EvaluateTryGetValue(args.Data, args.AttributeName, out value))
                return (args.FillResultValue(value));
            return false;
        }
        #endregion
        #region Výkonné bloky pro třídu: 1365: Stav kapacit
        /// <summary>
        /// Deklaruje extended atributy pro třídu 1365: Stav kapacit
        /// </summary>
        /// <param name="args"></param>
        internal void GetExtendedAttributes1365(ClassTreeExtenderGetAttributesArgs args)
        {
			// Nebudeme zobrazovat atributy Master.
			//  Do argumentu, do jeho seznamu skrytých skupin, přidáme skupinu Master => což jsou všechny standardní atributy:
            args.HideGreenAttributesGroup.Add(AttributeGroupType.Master);

            // Místo toho dáme svoje atributy.
			//  Důležitý je druhý údaj v konstruktoru (například "Time"): 
			//   pokud bude přesně odpovídat názvu property v tom objektu, který vrátíme z naší metody this.TryGetDataObject1365(),
			//   pak v metodě this.TryGetValue1365() nemusíme dohledávat hodnotu tohoto atributu ze stejnojmenné property,
			//   to zajistí vrstva Support.
			//  Pokud ale nadefinujeme atribut s názvem který nemá odpovídající property 
			//   (viz poslední řádek obsahující atribut "CapacityUnitRefNaz"), pak jej musíme řešit explicintě, viz metoda this.TryGetValue1365().
			// POZOR: když zmiňuji "Property", myslí se tím Property, a ne instanční proměnná. Musí mít { get; } accessor !
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Časový interval Od-Do", "Time"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Počet linek", "LineCount"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Celkově dostupná kapacita", "CapacityTotal"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Reálně využitá kapacita", "CapacityUsedReal", "Využitá kapacita pro reálné úkoly (výrobní příkazy)"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Kapacita využitá pro návrhy", "CapacityUsedPlan", "Využitá kapacita pro plánované úkoly (návrhy)"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Zbývající kapacita", "CapacityDisponible", "Zbývající kapacita"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Celkově využitá kapacita", "CapacityUsed", "Celkově využitá kapacita"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("% využité kapacity", "CapacityUsedPercent"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Plánovací jednotka", "CapacityUnitRefNaz", "Reference a název kapacitní jednotky"));
        }
        /// <summary>
        /// Deklaruje extended vztahy pro třídu 1365: Stav kapacit
        /// </summary>
        /// <param name="args"></param>
        private void GetExtendedRelations1365(ClassTreeExtenderGetRelationsArgs args)
        {
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt třídy 1365: Stav kapacit
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataObject1365(EvaluationDataSourceGetObjectArgs args)
        {
            return (args.FillResultData(this.PlanningData.CapacityData.FindCapacityLevel(args.SearchGId, args.ElementPointer.Row)));
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt, který je v daném vztahu k objektu třídy 1365: Stav kapacit
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataRelated1365(EvaluationDataSourceGetRelatedObjectArgs args)
        {
            CapacityLevelItemCls cLevel = args.OriginData as CapacityLevelItemCls;
            if (cLevel == null) return false;
            switch (args.TargetRelationNumber)
            {
                case 100346:        // Kapacitní plánovací jednotka
                    return args.FillResultData(cLevel.CapacityUnit.PlanUnitData);
                case 100561:        // Kapacitní verze plánu
                    return args.FillResultData(this.PlanningData.PlanningParameters.PlanCVersionData);
            }
            return false;
        }
        /// <summary>
        /// Vyhledá v objektu a uloží do args hodnotu daného atributu pro objekt třídy 1365: Stav kapacit
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetValue1365(EvaluationDataSourceGetValueArgs args)
        {
            CapacityLevelItemCls cLevel = args.Data as CapacityLevelItemCls;
            if (cLevel == null) return false;
            switch (args.AttributeName)
            {
				// Poznámka: pro názvy atributů, které přesně odpovídají názvům property našeho objektu (vráceného v metodě this.TryGetDataObject1365())
				//           pro ně nemusíme hodnotu hledat my, tu si najde vrstva Support sama.
				//           Proto jsou následující řádky zakomentované:

                //case "Time": return args.FillResultValue(cLevel.Time.ToString());
                //case "LineCount": return args.FillResultValue(cLevel.LineCount.ToString());
                //case "CapacityTotal": return args.FillResultValue(cLevel.CapacityTotal);
                //case "CapacityUsedReal": return args.FillResultValue(cLevel.CapacityUsedReal);
                //case "CapacityUsedPlan": return args.FillResultValue(cLevel.CapacityUsedPlan);
                //case "CapacityDisponible": return args.FillResultValue(cLevel.CapacityDisponible);
                //case "CapacityUsed": return args.FillResultValue(cLevel.CapacityUsed);
                //case "CapacityUsedPercent": return args.FillResultValue(cLevel.CapacityUsedPercent);

				// Poznámka: pouze atributy s názvem, pro který neexistuje property, musíme řešit explicitně:

                case "CapacityUnitRefNaz": return args.FillResultValue(cLevel.Parent.PlanUnitCReferNazev);
            }
            return false;
        }
        #endregion
		#region Výkonné bloky pro třídu: 1816: Kapacitní úkol, pracovní čas
		/// <summary>
        /// Deklaruje extended atributy pro třídu 1816: Kapacitní úkol, pracovní čas
        /// </summary>
        /// <param name="args"></param>
		internal void GetExtendedAttributes1816(ClassTreeExtenderGetAttributesArgs args)
        {
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Časový interval", "WorkTime", "Časový interval, po který se v tomto časovém úseku pracuje."));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Výrobní fáze", "Phase", "Aktuální fáze, prováděná v tomto čase"));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Množství finálu", "QtyFinal", "Množství finálního výrobku celkem - toto množství se neplánuje, jen slouží k určování potřebnosti alokace fáze MoveTime, TBC, TEC."));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Množství potřebné", "QtyRequired", "Množství chybějící, toto se bere do plánu. Fyzicky vyráběný počet na tomto tasku."));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Fixovaná operace", "IsFixedTask", "Příznak, zda operace je/není fixovaná v čase"));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Odvedená kapacita", "PassCapacity", "Množství práce (sekund), která se provede v tomto čase"));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Spotřeba kapacity", "WorkCapacity", "Množství kapacity (sekund), kterou tato práce spotřebuje na kapacitní jednotce."));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Druh tasku", "CapacType", "Druh tasku, určuje cílový druh čerpaných kapacit (Reál, Plán)."));
			args.ExtendedAttributes.Add(new ClassExtendAttribute("Využití kapacit", "StandardRatio", "Poměr využití kapacit v tomto čase. Má význam: Procento plnění norem."));
        }
        /// <summary>
		/// Deklaruje extended vztahy pro třídu 1816: Kapacitní úkol, pracovní čas
        /// Tyto vztahy následně musí vyřešit metoda this.TryGetDataRelated1817(), protože standardní mechanismus je nerozpozná.
        /// </summary>
        /// <param name="args"></param>
        private void GetExtendedRelations1816(ClassTreeExtenderGetRelationsArgs args)
        {
        }
        /// <summary>
		/// Vyhledá v paměti a uloží do args požadovaný objekt třídy 1816: Kapacitní úkol, pracovní čas
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataObject1816(EvaluationDataSourceGetObjectArgs args)
		{	// Na tuto metodu často nedojde, protože objekt s daty vracíme většinou přímo ze vztahu z třídy 1817: Kapacitní úkol, pracovní jednotka.
			return (args.FillResultData(this.AxisHeap.SearchForWorkTime(args.SearchGId)));
        }
        /// <summary>
		/// Vyhledá v paměti a uloží do args požadovaný objekt, který je v daném vztahu k objektu třídy 1816: Kapacitní úkol, pracovní čas
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataRelated1816(EvaluationDataSourceGetRelatedObjectArgs args)
        {
			WorkTimeCls workTime = args.OriginData as WorkTimeCls;
			if (workTime == null) return false;
            switch (args.TargetRelationNumber)
            {
				case 103303:                 // Vztah 103303: Paralelní průchod (zprava: Pracovní čas)
					return args.FillResultData(workTime.Parent);
            }
            return false;
        }
        /// <summary>
		/// Vyhledá v objektu a uloží do args hodnotu daného atributu pro objekt třídy 1816: Kapacitní úkol, pracovní čas
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetValue1816(EvaluationDataSourceGetValueArgs args)
        {
            WorkTimeCls workTime = args.Data as WorkTimeCls;
            if (workTime == null) return false;
            switch (args.AttributeName)
            {
				case "WorkTime":             // Časový interval: Časový interval, po který se v tomto časovém úseku pracuje.
					return args.FillResultValue(workTime.WorkTime);
				case "Phase":                // Výrobní fáze: Aktuální fáze, prováděná v tomto čase
					return args.FillResultValue(workTime.Phase);
				case "QtyFinal":             // Množství finálu: Množství finálního výrobku celkem - toto množství se neplánuje, jen slouží k určování potřebnosti alokace fáze MoveTime, TBC, TEC
					return args.FillResultValue(workTime.QtyFinal);
				case "QtyRequired":          // Množství potřebné: Množství chybějící, toto se bere do plánu. Fyzicky vyráběný počet na tomto tasku.
					return args.FillResultValue(workTime.QtyRequired);
				case "IsFixedTask":          // Fixovaná operace: Příznak, zda operace je/není fixovaná v čase
					return args.FillResultValue(workTime.IsFixedTask);
				case "PassCapacity":         // Odvedená kapacita: Množství práce (sekund), která se provede v tomto čase
					return args.FillResultValue(workTime.PassCapacity);
				case "WorkCapacity":         // Spotřeba kapacity: Množství kapacity (sekund), kterou tato práce spotřebuje na kapacitní jednotce
					return args.FillResultValue(workTime.WorkCapacity);
				case "CapacType":            // Druh tasku: Druh tasku, určuje cílový druh čerpaných kapacit (Reál, Plán).
					return args.FillResultValue(workTime.CapacType);
				case "StandardRatio":        // Využití kapacit: Poměr využití kapacit v tomto čase. Má význam: Procento plnění norem.
					return args.FillResultValue(workTime.StandardRatio * 100m);
				case "phase":
					return args.FillResultValue(workTime.Phase);
				case "time_begin":
					return args.FillResultValue(workTime.WorkTime.Begin);
				case "time_end":
					return args.FillResultValue(workTime.WorkTime.End);
				case "work_capacity":
					return args.FillResultValue(workTime.WorkCapacity);
				case "standard_ratio":
					return args.FillResultValue(workTime.StandardRatio * 100m);
            }
            return false;
        }
        #endregion
        #region Výkonné bloky pro třídu: 1817: Kapacitní úkol, pracovní jednotka
        /// <summary>
        /// Deklaruje extended atributy pro třídu 1817: Kapacitní úkol, pracovní jednotka
        /// </summary>
        /// <param name="args"></param>
        internal void GetExtendedAttributes1817(ClassTreeExtenderGetAttributesArgs args)
        {
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Množství finálu", "QtyFinal", "Množství finálního výrobku celkem - toto množství se neplánuje, jen slouží k určování potřebnosti alokace fáze MoveTime, TBC, TEC."));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Množství potřebné", "QtyRequired", "Množství chybějící, toto se bere do plánu. Fyzicky vyráběný počet na tomto tasku."));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Fixovaná operace", "IsFixedTask", "Příznak, zda operace je/není fixovaná v čase"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Kategorie úkolu", "CapacType", "Druh tasku, určuje cílový druh čerpaných kapacit (Reál, Plán)"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Druh zdroje kapacit", "Category", "Kategorie zdroje (pracoviště, profese, obecný zdroj)"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Odvedená kapacita", "PassCapacity", "Množství práce (sekund), která se provede v tomto čase"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Spotřeba kapacity", "UseCapacity", "Množství kapacity (sekund), kterou tato práce spotřebuje na kapacitní jednotce."));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Částečné vytížení", "UseRatio", "Poměr využití kapacitní jednotky. Standardně 1, menší hodnota při využití jen části KPJ."));
        }
        /// <summary>
        /// Deklaruje extended vztahy pro třídu 1817: Kapacitní úkol, pracovní jednotka.
        /// Tyto vztahy následně musí vyřešit metoda this.TryGetDataRelated1817(), protože standardní mechanismus je nerozpozná.
        /// </summary>
        /// <param name="args"></param>
        private void GetExtendedRelations1817(ClassTreeExtenderGetRelationsArgs args)
        {
            args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_WorkUnit_PlanUnitSAxis, "Záznam osy S", PlanUnitSAxisCls.ClassNr));
            args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_WorkUnit_PlanUnitCTask, "Kapacitní úkol", PlanUnitCTaskCls.ClassNr));
            args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_WorkUnit_PlanUnitC, "Kapacitní jednotka", PlanUnitCCls.ClassNr));
            args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_WorkUnit_CapacityLevel, "Stav kapacit", PlanUnitCClCls.ClassNr));
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt třídy 1817: Kapacitní úkol, pracovní jednotka
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataObject1817(EvaluationDataSourceGetObjectArgs args)
        {
            return (args.FillResultData(this.PlanningData.AxisHeap.FindIWorkItem(args.SearchGId)));
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt, který je v daném vztahu k objektu třídy 1817: Kapacitní úkol, pracovní jednotka
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataRelated1817(EvaluationDataSourceGetRelatedObjectArgs args)
        {
            WorkUnitCls workUnit = args.OriginData as WorkUnitCls;
            if (workUnit == null) return false;
            CapacityUnitCls unit;
            switch (args.TargetRelationNumber)
            {
                case Constants.RelationExtNumber_WorkUnit_PlanUnitSAxis:     // Záznam osy S          PlanUnitSAxisCls.ClassNr
                    return args.FillResultData(workUnit.AxisData);
                case Constants.RelationExtNumber_WorkUnit_PlanUnitCTask:     // Kapacitní úkol        PlanUnitCTaskCls.ClassNr
                    return args.FillResultData(workUnit.TaskData);
                case Constants.RelationExtNumber_WorkUnit_PlanUnitC:         // Kapacitní jednotka    PlanUnitCCls.ClassNr
                    unit = this.PlanningData.CapacityData.GetCapacityUnit(workUnit.CapacityUnit);
                    if (unit != null)
                        return args.FillResultData(unit.PlanUnitData);
                    break;
                case Constants.RelationExtNumber_WorkUnit_CapacityLevel:     // Stav kapacit          PlanUnitCClCls.ClassNr
                    unit = this.PlanningData.CapacityData.GetCapacityUnit(workUnit.CapacityUnit);
                    if (unit != null)
                        return args.FillResultData(unit.SeekLevelForTimeIndex(workUnit.CapacityLevelTimeIndex));
                    break;
                case 103304:                                                 // Pracovní čas => míří k tasku
                    return args.FillResultData(workUnit.Parent);
                case 103305:                                                 // Zdroj kapacit => obecný subjekt
                    return args.FillRelationRecord(workUnit.CapacitySource); // Nemáme data, naplníme jen číslo záznamu, zbytek si dohledá jádro.
                case 103306:                                                 // Kapacitní linka => míří ke kapacitní jednotce
                    unit = this.PlanningData.CapacityData.GetCapacityUnit(workUnit.CapacityUnit);
                    if (unit != null)
                        return args.FillResultData(unit.SeekDesk(workUnit));
                    break;
            }
            return false;
        }
        /// <summary>
        /// Vyhledá v objektu a uloží do args hodnotu daného atributu pro objekt třídy 1817: Kapacitní úkol, pracovní jednotka
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetValue1817(EvaluationDataSourceGetValueArgs args)
        {
            WorkUnitCls workUnit = args.Data as WorkUnitCls;
            if (workUnit == null) return false;
            switch (args.AttributeName)
            {
                case "IsFixedTask": return args.FillResultValue((workUnit.IsFixedTask ? "Ano" : "Ne"));
                case "CapacType": return args.FillResultValue(workUnit.CapacType);
                case "Category": return args.FillResultValue(workUnit.Category);
            }
            return false;
        }
        #endregion
        #region Výkonné bloky pro třídu: 1180: Plánovací jednotka S osa
        /// <summary>
        /// Deklaruje extended atributy pro třídu 1180: Plánovací jednotka S osa
        /// </summary>
        /// <param name="args"></param>
        internal void GetExtendedAttributes1180(ClassTreeExtenderGetAttributesArgs args)
        { }
        /// <summary>
        /// Deklaruje extended vztahy pro třídu 1180: Plánovací jednotka S osa
        /// Tyto vztahy následně musí vyřešit metoda this.TryGetDataRelated1817(), protože standardní mechanismus je nerozpozná.
        /// </summary>
        /// <param name="args"></param>
        private void GetExtendedRelations1180(ClassTreeExtenderGetRelationsArgs args)
        {
			args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_AxisS_EnquiryEntry, "Položka reálné poptávky", 214, "Přímý vztah na konkrétní položku dokladu Obecná poptávka, která je způsobitelem na tomto záznamu."));
			args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_AnyPlan_FinalAxisS, "Finální záznam osy S", 1180, "Pomocí vztahů dohledaný záznam osy S, do něhož přejde největší podíl aktuálního záznamu."));
		}
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt třídy 1180: Plánovací jednotka S osa
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataObject1180(EvaluationDataSourceGetObjectArgs args)
        {
            return (args.FillResultData(this.PlanningData.AxisHeap.FindAxisSItem(args.SearchGId)));
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt, který je v daném vztahu k objektu třídy 1180: Plánovací jednotka S osa
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataRelated1180(EvaluationDataSourceGetRelatedObjectArgs args)
        {
            MaterialPlanAxisItemCls axis = args.OriginData as MaterialPlanAxisItemCls;
            if (axis == null) return false;
            switch (args.TargetRelationNumber)
            {
                case Constants.RelationExtNumber_AxisS_EnquiryEntry:      // Položka reálné poptávky:   Přímý vztah na konkrétní položku dokladu Obecná poptávka, která je způsobitelem na tomto záznamu.
                    if (axis.AuthorObj != 0)
                        return args.FillRelationRecord(axis.AuthorSubj, axis.AuthorObj);
                    break;
				case Constants.RelationExtNumber_AnyPlan_FinalAxisS:      // Finální záznam osy S
					MaterialPlanAxisItemCls axisFinal = this.GetFinalAxisS(axis.AxisGID);
					if (axisFinal != null)
						return args.FillResultData(axisFinal, axisFinal.AxisID);
                    break;
                case 101586:        // Dílec		Plánovací jednotka S osa	constr_element	Nonsubjekt - Subjekt	Statický	47
                    return args.FillRelationRecord(axis.ConstrElement);
                case 8828:          // Dodavatel		Plánovací jednotka S osa	supplier	Nonsubjekt - Subjekt	Statický	30
                    return args.FillRelationRecord(axis.CurrentSupplierGID.RecordNumber);
                case 100637:        // Katalogové číslo		Plánovací jednotka S osa	catalog_number	Nonsubjekt - Subjekt	Statický	44
                    return args.FillRelationRecord(axis.CatalogNumber);
                case 100939:        // Kategorie požadavku		Plánovací jednotka S osa	req_categories	Nonsubjekt - Subjekt	Statický	46
                    return args.FillRelationRecord(axis.RequestCategory);
                case 9096:          // Komponenta kusovníku PJ		Plánovací jednotka S osa	a_structure	Nonsubjekt - Nonsubjekt	Statický	
                    return args.FillRelationRecord(axis.AStructure);
                case 9322:          // Komponenta VP		Plánovací jednotka S osa	product_order_structure	Nonsubjekt - Nonsubjekt	Statický	42
                    return args.FillRelationRecord(axis.ProductOrderStructure);
                case 8995:          // Opravil		Plánovací jednotka S osa	user_update	Nonsubjekt - Subjekt	Statický	
                    return args.FillRelationRecord(Steward.CurrentUser.RecordNumber);
                case 8827:          // Plánovací jednotka		Plánovací jednotka S osa	plan_unit_s	Nonsubjekt - Subjekt	Statický	2
                    return args.FillRelationRecord(axis.PlanUnitS);
                case 9561:          // Potomek		Plánovací jednotka S osa	descendant	Nonsubjekt - Nonsubjekt	Statický	43
                    break;
                case 8830:          // Předchůdce		Plánovací jednotka S osa	parent	Nonsubjekt - Nonsubjekt	Statický	40
                    break;
                case 100653:        // Ref. číslo OP		Plánovací jednotka S osa	reference_number	Nonsubjekt - Nonsubjekt	Statický	45
                    return args.FillRelationRecord(axis.ReferenceNumber);
                case 8868:          // Sklad		Plánovací jednotka S osa	stock	Nonsubjekt - Subjekt	Statický	4
                    return args.FillRelationRecord(axis.StockPlan);
                case 9095:          // Stav skladu PJ		Plánovací jednotka S osa	plan_unit_s_sl	Nonsubjekt - Nonsubjekt	Statický	
                    break;
                case 9321:          // T Modifikace STPV		Plánovací jednotka S osa	a_operation_mod	Nonsubjekt - Subjekt	Statický	41
                    return args.FillRelationRecord(axis.AOperationMod);
                case 103292:        // Verze kapacitního plánu		Plánovací jednotka S osa	plan_c_version	Nonsubjekt - Subjekt	Statický	49
                    return args.FillResultData(this.PlanningData.PlanningParameters.PlanCVersionData);
                case 8994:          // Zavedl		Plánovací jednotka S osa	user_insert	Nonsubjekt - Subjekt	Statický	
                    return args.FillRelationRecord(Steward.CurrentUser.Osoba);
                case 8829:          // Způsobitel		Plánovací jednotka S osa	author_sub	Nonsubjekt - Subjekt	Statický	36
                    return args.FillRelationRecord(axis.AuthorSubj);
            }
            return false;
        }
		/// <summary>
		/// Metoda se pokusí najít finální záznam osy S, do něhož (přes vztahy) doputuje největší část z daného záznamu osy S.
		/// </summary>
		/// <param name="axisGId"></param>
		/// <returns></returns>
		public MaterialPlanAxisItemCls GetFinalAxisS(GID axisGId)
		{
			List<GID> finalGIdList = this.AxisHeap.FindRelationLastIDData(axisGId);
			List<MaterialPlanAxisItemCls> finalAxisSList = this.AxisHeap.FindAxisSItemList(finalGIdList);
			if (finalAxisSList.Count == 0) return null;
			if (finalAxisSList.Count > 1)
				finalAxisSList.Sort((a, b) => (b.Qty.CompareTo(a.Qty)));           // Setřídíme podle Qty (desc)
			return finalAxisSList[0];
		}
        /// <summary>
        /// Vyhledá v objektu a uloží do args hodnotu daného atributu pro objekt třídy 1180: Plánovací jednotka S osa
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetValue1180(EvaluationDataSourceGetValueArgs args)
        {
            MaterialPlanAxisItemCls axis = args.Data as MaterialPlanAxisItemCls;
            if (axis == null) return false;
            StockCardCls stockCard = this.MaterialData.GetStockCardOne(axis.StockUnit);
            switch (args.AttributeName)
            {
                case "action":                // Navrhovaná akce	Řetězec	mfr_proposal_action	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Action);
                case "author_obj":            // Způsobitel - položka	Číslo	editgeneral	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.AuthorObj);
                case "axis_seq":              // Pořadí osy	Číslo	editgeneral	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.AxisSeq);
                case "axis_seq2":             // axis_seq2	Číslo	editgeneral	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.AxisSeq2);
                case "btl_disp_po":           // BTLdispozice po	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    break;
                case "cislo_nonsubjektu":     // Číslo non subjektu	Číslo		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.AxisID);
                case "conc_conf":             // Návrh potvrzen	Řetězec	typ_ano_ne	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.ConcConf);
                case "date":                  // Datum	Datum a čas	Datum_cas	Ne	1180	Plánovací jednotka S osa
                    if (axis.IsFromWhAnyEnquiry && axis.DateFinalRequest.HasValue)
                        return args.FillResultValue(axis.DateFinalRequest.Value);
                    else
                        return args.FillResultValue(axis.DatePlanEnd);
                case "date_adj":              // Datum upravené	Datum a čas	Datum_cas	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.DatePlanEnd);
                case "date_insert":           // Datum zavedení	Datum a čas	Datum_cas	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(DateTime.Now);
                case "date_start_plan":       // Datum zahájení	Datum a čas	Datum_cas	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(PlanningComponentCls.DateTimeToDateTimeNotNull(axis.DatePlanBegin, axis.DatePlanEnd));
                case "date_start_real":       // Datum skutečného zahájení	Datum a čas	Datum_cas	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(PlanningComponentCls.DateTimeToSqlDateTime(axis.DatePlanBegin));
                case "date_update":           // Datum opravy	Datum a čas	Datum_cas	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(DateTime.Now);
                case "delivery_time":         // Doba dodávky	Číslo	editgeneral	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.DeliveryTime);
                case "delivery_time_res":     // Doba dodávky rezerva	Číslo	editgeneral	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.DeliveryTimeRes);
                case "ext_int":               // Charakter požadavku	Řetězec	mfr_int_ext	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.ExtInt);
                case "change_type":           // Typ změny detailní	Číslo	mfr_axis_change_type	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.ChangeType);
                case "level":                 // Úroveň	Číslo	editgeneral	Ne	1180	Plánovací jednotka S osa
                    if (stockCard != null)
                        return args.FillResultValue(stockCard.Level);
                    break;
                case "marker1":               // Stavový příznak 1	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker1);
                case "marker2":               // Stavový příznak 2	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker2);
                case "marker3":               // Stavový příznak 3	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker3);
                case "marker4":               // Stavový příznak 4	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker4);
                case "marker5":               // Stavový příznak 5	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker5);
                case "marker6":               // Stavový příznak 6	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker6);
                case "marker7":               // Stavový příznak 7	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker7);
                case "marker8":               // Stavový příznak 8	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Marker8);
                case "minimum":               // Minimum	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    if (stockCard != null)
                        return args.FillResultValue(stockCard.MinStockQty);
                    break;
                case "origin":                // Původ	Řetězec	mfr_origin	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue("");
                case "origin_reason":         // Důvody vzniku záznamu	Číslo	mfr_axis_origin_reason	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.OriginReason);
                case "qty":                   // Požadováno	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Qty);
                case "qty_d":                 // K dispozici PJ	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyD);
                case "qty_dp":                // K dispozici PJ D+N	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyDp);
                case "qty_dp_c":              // K dispozici PJ D+N,P	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyDpC);
                case "qty_prop":              // Návrh	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyProp);
                case "qty_prop_adj":          // Návrh upravený	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyPropAdj);
                case "qty_prop_real":         // Vyřízeno	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyPropReal);
                case "qty_st_d":              // K dispozici PJ sklad	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyStD);
                case "qty_st_dp":             // K dispozici PJ sklad D+N	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyStDp);
                case "qty_st_dp_c":           // K dispozici PJ sklad D+N,P	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyStDpC);
                case "qty_st_dp2":            // Zajištění PJ sklad D+N	Číslo	editnumeric_19_6	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.QtyStDp2);
                case "reference":             // Reference	Řetězec		Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.AxisID);
                case "transfer":              // Převod	Řetězec	typ_ano_ne	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Transfer);
                case "type":                  // Typ dispozice	Řetězec	mfr_prj_vyd	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.Type);
                case "type_rec":              // Způsob vzniku záznamu	Řetězec	mfr_mrp_type_rec	Ne	1180	Plánovací jednotka S osa
                    return args.FillResultValue(axis.TypeRec);
            }

            /*
            axis.Acquirement;
            axis.Action;
            axis.AStructure;
            axis.AxisSeq;
            axis.AxisSeq2;
            axis.CatalogNumber;
            axis.ConcConf;
            axis.ConstrElement;
            axis.DateFinalRequest;
            axis.DateFixed;
            axis.DateOriginal;
            axis.DatePlanBegin;
            axis.DatePlanEnd;
            axis.DatePlanRequest;
            axis.DatePlanTime;
            axis.DeliveryTime;
            axis.DeliveryTimeRes;
            axis.Depart;
            axis.EnablePlanning;
            axis.ExtInt;
            axis.ChangeQty;
            axis.ChangeType;
            axis.IsFixedAxis;
            axis.IsFromOriginalRecord;
            axis.IsFromProductOrder;
            axis.IsFromProductOrderStructure;
            axis.IsProposal;
            axis.OriginReason;
            axis.PlanningState;
            axis.PlanovatKkzm;
            axis.PlanovatSklad;
            axis.Qty;
            axis.QtyD;
            axis.QtyDp;
            axis.QtyDpC;
            axis.QtyProp;
            axis.SuggestedAction;
            axis.TaskList;
            axis.Transfer;
            axis.Type;
            axis.TypeRec;
            axis.VarExt;
             */
            return false;
        }
        #endregion
        #region Výkonné bloky pro třídu: 1363: Kapacitní úkol
        /// <summary>
        /// Deklaruje extended atributy pro třídu 1363: Kapacitní úkol
        /// </summary>
        /// <param name="args"></param>
        internal void GetExtendedAttributes1363(ClassTreeExtenderGetAttributesArgs args)
        {
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Čas operace", "WorkTime"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Řádek operace", "OperationLine"));
            args.ExtendedAttributes.Add(new ClassExtendAttribute("Název operace", "OperationName"));
        }
        /// <summary>
        /// Deklaruje extended vztahy pro třídu 1363: Kapacitní úkol
        /// Tyto vztahy následně musí vyřešit metoda this.TryGetDataRelated1817(), protože standardní mechanismus je nerozpozná.
        /// </summary>
        /// <param name="args"></param>
        private void GetExtendedRelations1363(ClassTreeExtenderGetRelationsArgs args)
        {
			args.ExtendedRelations.Add(new ClassExtendRelation(Constants.RelationExtNumber_AnyPlan_FinalAxisS, "Finální záznam osy S", 1180, "Pomocí vztahů dohledaný záznam osy S, do něhož přejde největší podíl aktuálního záznamu."));
		}
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt třídy 1363: Kapacitní úkol
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataObject1363(EvaluationDataSourceGetObjectArgs args)
        {
            return (args.FillResultData(this.PlanningData.AxisHeap.FindTaskCItem(args.SearchGId)));
        }
        /// <summary>
        /// Vyhledá v paměti a uloží do args požadovaný objekt, který je v daném vztahu k objektu třídy 1363: Kapacitní úkol
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetDataRelated1363(EvaluationDataSourceGetRelatedObjectArgs args)
        {
            CapacityPlanWorkItemCls task = args.OriginData as CapacityPlanWorkItemCls;
            if (task == null) return false;
            switch (args.TargetRelationNumber)
            {
				case Constants.RelationExtNumber_AnyPlan_FinalAxisS:      // Finální záznam osy S
					MaterialPlanAxisItemCls axisFinal = this.GetFinalAxisS(task.AxisGID);
					if (axisFinal != null)
						return args.FillResultData(axisFinal, axisFinal.AxisID);
					break;
				case 100353:                 // Kapacitní PJ		Kapacitní úkol	plan_unit_c	Nonsubjekt - Subjekt	Statický	1
                    CapacityUnitCls unit = this.CapacityData.FindCapacityUnit(task.PlanUnitCPrimary);
                    if (unit != null)
                        args.FillResultData(unit.PlanUnitData);
                    break;
                case 100354:                 // Verze kapacitního plánu		Kapacitní úkol	plan_c_version	Nonsubjekt - Subjekt	Statický	2
                    return args.FillResultData(this.PlanningData.PlanningParameters.PlanCVersionData);
                case 100355:                 // PJ S osa		Kapacitní úkol	plan_unit_s_axis	Nonsubjekt - Nonsubjekt	Statický	3
                    return args.FillResultData(task.AxisData);
                case 100356:                 // Operace VP		Kapacitní úkol	product_order_operation	Nonsubjekt - Nonsubjekt	Statický	4
                    if (task.DocumentType == TDocumentType.Production)
                        return args.FillRelationRecord(task.OperationKey);
                    break;
                case 100357:                 // Operace STPV		Kapacitní úkol	a_operation	Nonsubjekt - Nonsubjekt	Statický	5
                    if (task.DocumentType == TDocumentType.PlanApproved)
                        return args.FillRelationRecord(task.OperationKey);
                    break;
                case 100654:                 // Ref. číslo OP		Kapacitní úkol	reference_number	Nonsubjekt - Nonsubjekt	Statický	6
                    return args.FillRelationRecord(task.Parent.ReferenceNumber);
                case 103313:                 // Vazby společných oper.		Kapacitní úkol	link	Nonsubjekt - Subjekt	Statický	7
                    return args.FillResultData(task.LinkObject);
            }
            return false;
        }
        /// <summary>
        /// Vyhledá v objektu a uloží do args hodnotu daného atributu pro objekt třídy 1363: Kapacitní úkol
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        internal bool TryGetValue1363(EvaluationDataSourceGetValueArgs args)
        {
            CapacityPlanWorkItemCls task = args.Data as CapacityPlanWorkItemCls;
            if (task == null) return false;

            IOperationTime operTime = task as IOperationTime;

            // Připravíme si soupis časů jednotlivých fází:
            Dictionary<OperationPhase, TimeRange> phaseTimeDict = task.GetPhaseTime();
            TimeRange timeWork = task.TimeWork;

            // Připravím si prostor pro obecnou operaci:
            IOperationData operation;

            switch (args.AttributeName)
            {
                // Extended:
                case "WorkTime":
                    return args.FillResultValue(timeWork);
                case "OperationLine":
                    operation = this.TpvGetOperationData(task);
                    if (operation != null)
                        return args.FillResultValue(operation.Refer);
                    break;
                case "OperationName":
                    operation = this.TpvGetOperationData(task);
                    if (operation != null)
                        return args.FillResultValue(operation.Nazev);
                    break;

                // Standard:
                case "c_llc":                  // LLC úkolu	Číslo	editgeneral	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(0);
                case "category":               // Kategorie	Řetězec	Kategorie požadavku	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Category);
                case "cislo_nonsubjektu":      // Číslo non subjektu	Číslo		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.TaskID);
                case "date_c_llc":             // Datum LLC úkolu	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(DateTime.Now);
                case "end_adj":                // Modifikovaný konec úkolu	Datum a čas		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(timeWork.End);
                case "end_task":               // Konec úkolu	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(timeWork.End);
                case "fixed_operation":        // Fixovaná operace	Číslo	mfr_oper_fixed	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.IsFixedTask);
                case "marker1":                // Stavový příznak 1	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker1);
                case "marker2":                // Stavový příznak 2	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker2);
                case "marker3":                // Stavový příznak 3	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker3);
                case "marker4":                // Stavový příznak 4	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker4);
                case "marker5":                // Stavový příznak 5	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker5);
                case "marker6":                // Stavový příznak 6	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker6);
                case "marker7":                // Stavový příznak 7	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker7);
                case "marker8":                // Stavový příznak 8	Řetězec		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.Marker8);
                case "move_batch_qty":         // Meziop. transportní dávka	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.MoveBatchQty);
                case "move_time":              // Mezioperační čas	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.MoveTime);
                case "move_time_mu":           // MJ meziop.času	Číslo	type_time_units	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.MoveTimeMu);
                case "move_time_start":        // Počátek meziop.času	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(phaseTimeDict[OperationPhase.MoveTime].Begin);
                case "move_time_start_adj":    // Modif. počátek meziop.času	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(phaseTimeDict[OperationPhase.MoveTime].Begin);
                case "next_task":              // Následující úkol	Číslo		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(0);
                case "paralel_passing_count":  // Počet paralelních průchodů	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.ParalelPassingCount);
                case "perc_completed":         // Procento splnění	Číslo	mfr_percent	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.PercCompleted);
                case "qty":                    // Počet	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.QtyRequired);
                case "start_adj":              // Modifikovaný počátek úkolu	Datum a čas		Ne	1363	Kapacitní úkol
                    return args.FillResultValue(phaseTimeDict[OperationPhase.TBC].Begin);
                case "start_tac":              // Počátek Tac	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(phaseTimeDict[OperationPhase.TAC].Begin);
                case "start_task":             // Počátek úkolu	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(phaseTimeDict[OperationPhase.TBC].Begin);
                case "start_tec":              // Počátek Tec	Datum a čas	Datum_cas	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(phaseTimeDict[OperationPhase.TEC].Begin);
                case "tac":                    // Tac	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.Tac);
                case "tac_mu":                 // MJ Tac	Číslo	type_time_units	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.TacMu);
                case "tbc":                    // Tbc	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.Tbc);
                case "tbc_mu":                 // MJ Tbc	Číslo	type_time_units	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.TbcMu);
                case "tec":                    // Tec	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.Tec);
                case "tec_mu":                 // MJ Tec	Číslo	type_time_units	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(operTime.TecMu);
                case "unit_count":             // Počet současně vyr. kusů	Číslo	editnumeric_19_6	Ne	1363	Kapacitní úkol
                    return args.FillResultValue(task.UnitCount);
            }
            return false;
        }
        #endregion
    }
}
